#include "uart.h"
#include <rtthread.h>

//pa9,pa10
int uart1_init(){
  
  GPIO_InitTypeDef  GPIO_InitStructure;  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  USART_InitTypeDef USART_InitStructure;
	
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART1, &USART_InitStructure);
  USART_Cmd(USART1,ENABLE);
	return 0;
}
INIT_BOARD_EXPORT(uart1_init);


char rt_hw_console_getchar(){	
		int ch =-1;
		if( USART_GetFlagStatus(USART1,USART_FLAG_RXNE)){
	
			 ch = USART1->DR;
		
			USART_ClearFlag(USART1,USART_FLAG_RXNE);
	
	}else{
			if( USART_GetFlagStatus(USART1,USART_FLAG_ORE)){
				USART_ClearFlag(USART1,USART_FLAG_ORE);
			}
		}
				
			return ch;
}

void usart1_send_char(char ch){

		USART1->DR = ch;
	
		while(!USART_GetFlagStatus(USART1,USART_FLAG_TC));
		USART_ClearFlag(USART1,USART_FLAG_TC);
}

void rt_hw_console_output(const char *str){
		const char *s= str;
		
		while(*s){			
				if('\n' == *s){
					usart1_send_char('\r');
				}
				usart1_send_char(*s);
			s++;
		}
	
}

